#include<iostream>
#include<thread>
#include <string>
using namespace std;


void test(const int& num, char* buf) {
    cout << "线程1开始执行" << endl;
    cout << "num1 = " << num << endl;
    cout << "buf1 = " << buf << endl;
    cout << "线程1执行完毕" << endl;
}

void test2(const int& num, const string& buf) {
    cout << "线程2开始执行" << endl;
    cout << "num2 = " << num << endl;
    cout << "buf2 = " << buf << endl;
    this_thread::sleep_for(1s);
    cout << "线程2执行完毕" << endl;
}
int main() {
    int myNum = 1;
    int& num = myNum;
    char myBuf[] = "only for test!";
    const string& myBuf2 = "buf2 only for test!";

    //传入的不是myNum的引用，指向地址不同，实际是值传递，即便主线程detach()，子线程使用num不会出问题
    //传入的指针依旧是指向muBuf的地址，所以detach后，子线程会出问题。可以将char*改为const string&
    thread th(test, num, myBuf);
    //使用const string&也有问题，即：不知道mybuf不知道什么时候转换为string，如果主线程执行完毕后，还没转换完毕，就有问题
    thread th2(test2, num, myBuf2);
    //thread th2(test2,num,string(myBuf));// 针对detach ,生成一个临时string对象，绑定const string&,使用这个方法，就会让string对象在主线程执行完毕前构造 在创建线程的同时构造临时对象是可行的
    //th.join();
    th.detach();
    th2.detach();
    //th2.join();
    //cout << "主线程执行完毕" << endl;
    return 0;
}

/* ————————————————
版权声明：本文为CSDN博主「LeetCode刷题记录」的原创文章，遵循CC 4.0 BY-SA版权协议，转载请附上原文出处链接及本声明。
原文链接：https://blog.csdn.net/qq_42147969/article/details/118325905 */